package com.briup.myblog.web.interceptor;

import com.briup.myblog.exception.CustomerException;
import com.briup.myblog.utils.GetToken;
import com.briup.myblog.utils.JwtUtil;
import com.briup.myblog.utils.UserInfoUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * 可以实现对需要进行token认证的请求进行拦截
 * 判断用户访问时，在请求头中提供的jwt字符串是否合法
 *
 * @Author 林观海
 */
@Slf4j
@Component
public class JWTInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        log.info("请求拦截器执行前拦截....");
        /**
         * 项目是前后端分离项目，导致浏览器会发送预检请求Options,不需要进行拦截判断
         * 当使用请求头获取信息时必须要有对预检请求Options的处理
         * 因为浏览器在每次刷新页面时都会发送预检请求，不处理将会导致拦截器不通过拿不到token
         */
        String method = request.getMethod();
        if(method.equals("OPTIONS")){
            return true;//通过拦截
        }

        //2.当请求是正常请求时，获取到请求头认证信息
        String token = GetToken.getToken(request);

        //通过用户的请求url和请求方法
        Map<String, Object> userInfo = JwtUtil.getInfo(token);
        //添加请求url和方法
        userInfo.put("url",request.getRequestURI());
        userInfo.put("method",request.getMethod());
        //最后将用户信息保存在ThreadLocal
        UserInfoUtil.setUserInfo(userInfo);
        return true;//通过拦截
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("controller执行结束后拦截....");
    }

    //@Override
    //public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    //    log.info("view和model组合结束后执行");//springMVC model view 组合
    //}
}
